﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades.Catalogo;
using Control.Catalogo;
using Entidades.General;
using Entidades.Solicitud;
using Oracle.DataAccess.Client;
using System.Data;
using Entidades.Consultas.Personalizadas;
using Entidades.Consultas;
using System.Configuration;
using System.Collections;
using Control.Solicitud;

namespace SICOIA.UserControls.Obra
{
    public partial class ucObra : System.Web.UI.UserControl
    {
        #region Controles

        private EntUsuario Usuario
        {
            get { return (EntUsuario)Session["UserPemex"]; }
        }

        EntSolicitud Solicitud = new EntSolicitud();
        CtrlSolicitud controlSolicitud = new CtrlSolicitud();
        CtrlTurnarJefeArea controlTurnarJefeArea = new CtrlTurnarJefeArea();
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if ((EntUsuario)Session["UserPemex"] == null)
            {
                Response.Write("<script>parent.window.open('../Marcos/EndPEMEX.aspx','_top')</script>");
                CancelarEdicion();
                return;
            }
            else
                PermisosUsuario();

            if (!Page.IsPostBack)
            {
                HddAccion.Value = (Request.Params["accion"] != null ? Request.Params["accion"].ToString() : "nuevo");
                LlenarCombos();
                HddvieneDeConsulta.Value = HddCveSolicitud.Value = (Request.Params["vieneDeConsulta"] != null ? Request.Params["vieneDeConsulta"].ToString() : "N");                

                if (HddAccion.Value == "nuevo")
                {
                    HddCveSolicitud.Value = (Request.Params["IdSolicitud"] != null ? Request.Params["IdSolicitud"].ToString() : "0");
                    GetSolicitud();
                    DoAfterPostback1.DoAfterPostbackJavaScript = "changeTipoInstalacion('L');";
                    EjecutaTipoSerivio("L");
                }
                else if (HddAccion.Value == "editar")
                {
                    HddCveSolicitudTrabajosRealizar.Value = (Request.Params["IdSolicitudTrabajosRealizar"] != null ? Request.Params["IdSolicitudTrabajosRealizar"].ToString() : "0");
                    getSolicitudTrabajosARealizar();
                }                
            }

            if (chkTipoInstalacion.Items.Count > 0)
            {
                foreach (ListItem item in chkTipoInstalacion.Items)
                    item.Attributes.Add("onclick", "javascript:changeTipoInstalacion(this.value);");
            }
        }

        private void PermisosUsuario()
        {
            if (Usuario.CveRol == 11)
            {
                divOficio.Visible = false;
                divNota.Visible = false;
                etiquetaTurnar.Visible = false;
                divPOA.Visible = true;
                lblTurnar.Visible = false;
                UpdatePanelComboTurnar.Visible = false;
                UpdatePanelJefes.Visible = false;
                btnAgregarJefe.Visible = false;
                btnEliminarJefe.Visible = false;
            }
        }

        #region "Eventos Toolbar"

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                EntSolicitudTrabajosRealizar solicitudTrabajo = MapFields();
                CtrlSolicitudTrabajosRealizar controlSolTrabRealizar = new CtrlSolicitudTrabajosRealizar();
                int solicitudCve = controlSolTrabRealizar.Insertar(solicitudTrabajo);

                DoAfterPostback1.DoAfterPostbackJavaScript = "changeTipoInstalacion('" + solicitudTrabajo.TrabajoRealizar + "');";
                if (HddAccion.Value.ToString() == "nuevo")
                    Mensaje("Se Registro Correctamente La Obra.", HddvieneDeConsulta.Value == "S" ? false : true, int.Parse(HddCveSolicitud.Value));
                else if (HddAccion.Value.ToString() == "editar")
                    Mensaje("Se Actualizo Correctamente La Obra.", false, int.Parse(HddCveSolicitud.Value));
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {

        }

        #endregion

        #region "Utilerias"

        private void Limpiar()
        {

        }

        private void Mensaje(string msg, bool Obra = false, int IdSolicitud = 0)
        {
            string script = string.Empty;
            string CadMensaje = string.Empty;
            CadMensaje = msg.Replace("`", "").Replace("´", "").Replace("\"", "").Replace("'`", "").Replace("'", "");
            script = "<script type='text/javascript' language='javascript'>alert('";
            script = script + CadMensaje + "');";

            if (Obra)
                script = script + "if (confirm('¿Desea Continuar Agregando Obras?')) window.parent.GoPage('Obra','&accion=nuevo&IdSolicitud=" + IdSolicitud.ToString() + "');" + " else window.parent.GoPage('BusquedaSolicitudPadre','');";

            script = script + "</script>";

            ScriptManager.RegisterStartupScript(UpdatePanelCuerpo, this.GetType(), "temp", script, false);
        }

        #endregion

        #region "Llenar Combos"

        protected EntSolicitudTrabajosRealizar MapFields()
        {
            EntSolicitudTrabajosRealizar solicitudTrabajo = new EntSolicitudTrabajosRealizar();

            solicitudTrabajo.CveTrabajoRealizar = int.Parse(HddCveSolicitudTrabajosRealizar.Value);
            solicitudTrabajo.POA = (Usuario.CveRol == 11) ? cmbPOA.SelectedValue : string.Empty; //Solo usuario solicitante puede agregar POA a la obra
            solicitudTrabajo.Descripcion = this.txtComentarios.Text;
            solicitudTrabajo.Origen = this.txtKmOrigen.Text;
            solicitudTrabajo.Destino = this.txtKmDestino.Text;

            Int32 intLongitud;
            Int32.TryParse(txtLongitud.Text, out intLongitud);

            solicitudTrabajo.Longitud = intLongitud.ToString();

            float floatResult;
            float.TryParse(this.txtDiametro.Text, out floatResult);
            solicitudTrabajo.Diametro = floatResult;

            solicitudTrabajo.NoPera = this.txtNoPera.Text;

            solicitudTrabajo.CveSolicitud = int.Parse(HddCveSolicitud.Value);

            solicitudTrabajo.CveTipoServicio = int.Parse(this.cmbTipoServicio.SelectedValue);

            float.TryParse(this.txtAnchoVia.Text, out floatResult);
            solicitudTrabajo.AnchoDerechoVia = floatResult;

            solicitudTrabajo.CveTipoSimplificacion = int.Parse(this.chkObra.SelectedItem.Value);

            // L.- loczalizacion, D.- Origen Destino,O.- Otros. .. Esta columna es usada para condicionar la creacion del nombre de la obra en base a los dstos proporcionados
            string stringValue = "O";
            if (chkTipoInstalacion.SelectedIndex == 0)
            {
                if (cmbTipoServicio.SelectedValue.ToString().Equals("-1")) throw new BussinesLogicException("Debe seleccionar una Localización");
                solicitudTrabajo.CveTipoServicio = int.Parse(cmbTipoServicio.SelectedValue.ToString());
                stringValue = "L";
            }
            else if (chkTipoInstalacion.SelectedIndex == 1)
            {
                if (cmbTipoServicioDuctos.SelectedValue.ToString().Equals("-1")) throw new BussinesLogicException("Debe seleccionar un Ducto");
                solicitudTrabajo.CveTipoServicio = int.Parse(cmbTipoServicioDuctos.SelectedValue.ToString());
                stringValue = "D";
            }
            else
            {
                if (cmbTipoServicioOtros.SelectedValue.ToString().Equals("-1")) throw new BussinesLogicException("Debe seleccionar el Servicio");
                solicitudTrabajo.CveTipoServicio = int.Parse(cmbTipoServicioOtros.SelectedValue.ToString());
            }

            solicitudTrabajo.TrabajoRealizar = stringValue;

            solicitudTrabajo.CveTipoProyecto = this.cmbProyecto.SelectedIndex;
            solicitudTrabajo.CveObraSiarp = this.txtObraSiarp.Text;
            solicitudTrabajo.CveSiarp = this.txtObraSiarp.Text;
            solicitudTrabajo.CveAvanceOperativo = this.cmbAvanceOperativo.SelectedIndex;

            float.TryParse(this.txtLongitud.Text, out floatResult);
            solicitudTrabajo.Largo = floatResult;

            solicitudTrabajo.Origen = this.txtOrigen.Text;
            solicitudTrabajo.Destino = this.txtDestino.Text;
            solicitudTrabajo.InstalacionDestino = txtDestino.Text;
            solicitudTrabajo.InstalacionOrigen = txtOrigen.Text;

            solicitudTrabajo.EsPrioritaria = this.chkPrioritaria.Checked ? "S" : "N";

            solicitudTrabajo.CveCampo = int.Parse(cmbCampo.SelectedValue);

            solicitudTrabajo.NumeroNotaTurno = this.txtNotaturno.Text;

            solicitudTrabajo.UsuarioMtto = Usuario.CveUsuario.ToString();

            solicitudTrabajo.FechaPrioritaria = txtFechaPrioritaria.Text;
            solicitudTrabajo.FechaEntregaPlanos = txtEntregaPlanos.Text;
            solicitudTrabajo.FechaPlanosCorregidos = txtPlanosCorregidos.Text;
            solicitudTrabajo.FechaPlanosValidados = txtPlanosValidados.Text;
            if(txtFechaArreglo.Text != string.Empty)
                solicitudTrabajo.FechaEstimadaArreglo = DateTime.Parse(txtFechaArreglo.Text);

            if (Usuario.CveRol != 11)
            {
                string Jefes = string.Empty;
                foreach (ListItem itemJefe in lstJefes.Items)
                    Jefes = Jefes + itemJefe.Value + "|";
                solicitudTrabajo.Jefes = Jefes.Substring(0, Jefes.Length - 1);
            }

            return solicitudTrabajo;
        }

        private void LlenarCombos()
        {
            LlenarComboPOA();
            LLenarComboTipoServicios();
            LlenarComboCampo();
            LlenarComboTipoProyecto();
            LlenarComboTipoAvanveOperativo();
            LlenarComboJef();
        }

        private void LlenarComboPOA()
        {
            cmbPOA.Items.Insert(0, new ListItem((DateTime.Now.Year - 1).ToString(), (DateTime.Now.Year - 1).ToString()));
            cmbPOA.Items.Insert(1, new ListItem(DateTime.Now.Year.ToString(), DateTime.Now.Year.ToString()));
            cmbPOA.SelectedIndex = 1;
        }

        private void LlenarComboCampo()
        {
            try
            {
                // llenamos el combo categoria campo.
                CtrlCampo controlTipoServicios = new CtrlCampo();
                List<EntCampo> listaTipoServicio = new List<EntCampo>();

                listaTipoServicio =
                    (List<EntCampo>)controlTipoServicios.ObtenerTodos()
                    .ConvertAll<EntCampo>(delegate(IEntidad enti) { return (EntCampo)enti; });

                int indexCombo = 0;
                this.cmbCampo.Items.Clear();
                this.cmbCampo.Items.Insert(0, new ListItem
                ("Seleccione un Elemento", "-1", true));

                foreach (EntCampo elemento in listaTipoServicio)
                {
                    this.cmbCampo.Items.Insert
                        (indexCombo += 1, new ListItem(elemento.Descripcion,
                            elemento.CveCampo.ToString(), true));
                }
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }

        private void LLenarComboTipoServicios()
        {
            try
            {
                // llenamos el combo tipo de servicio
                CtrlTiposServicios controlTipoServicios = new CtrlTiposServicios();
                List<EntTipoServicio> listaTipoServicio = new List<EntTipoServicio>();

                listaTipoServicio =
                    (List<EntTipoServicio>)controlTipoServicios.ObtenerTodos()
                    .ConvertAll<EntTipoServicio>(delegate(IEntidad enti) { return (EntTipoServicio)enti; });


                var listaFiltrada = listaTipoServicio.Where(x => x.TrabajoRealizar == "L");

                int indexCombo = 0;
                this.cmbTipoServicio.Items.Clear();
                this.cmbTipoServicio.Items.Insert(0, new ListItem
                ("Seleccione un Elemento", "-1", true));

                foreach (EntTipoServicio elemento in listaFiltrada)
                {
                    this.cmbTipoServicio.Items.Insert
                        (indexCombo += 1, new ListItem(elemento.Descripcion,
                            elemento.CveTipoServicio.ToString(), true));
                }

                listaFiltrada = listaTipoServicio.Where(x => x.TrabajoRealizar == "D");
                indexCombo = 0;
                this.cmbTipoServicioDuctos.Items.Clear();
                this.cmbTipoServicioDuctos.Items.Insert(0, new ListItem
                ("Seleccione un Elemento", "-1", true));

                foreach (EntTipoServicio elemento in listaFiltrada)
                {
                    this.cmbTipoServicioDuctos.Items.Insert
                        (indexCombo += 1, new ListItem(elemento.Descripcion,
                            elemento.CveTipoServicio.ToString(), true));
                }

                listaFiltrada = listaTipoServicio.Where(x => x.TrabajoRealizar == "O");
                indexCombo = 0;
                this.cmbTipoServicioOtros.Items.Clear();
                this.cmbTipoServicioOtros.Items.Insert(0, new ListItem
                ("Seleccione un Elemento", "-1", true));

                foreach (EntTipoServicio elemento in listaFiltrada)
                {
                    this.cmbTipoServicioOtros.Items.Insert
                        (indexCombo += 1, new ListItem(elemento.Descripcion,
                            elemento.CveTipoServicio.ToString(), true));
                }
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }

        private void LlenarComboTipoProyecto()
        {
            try
            {
                // llenamos el combo tipo proyecto 
                CtrlTipoProyecto controlTipoServicios = new CtrlTipoProyecto();
                List<EntTipoProyecto> listaTipoServicio = new List<EntTipoProyecto>();

                listaTipoServicio =
                    (List<EntTipoProyecto>)controlTipoServicios.ObtenerTodos().ConvertAll<EntTipoProyecto>(delegate(IEntidad enti) { return (EntTipoProyecto)enti; });

                int indexCombo = 0;
                this.cmbProyecto.Items.Clear();
                this.cmbProyecto.Items.Insert(0, new ListItem
                ("Seleccione un Elemento", "-1", true));

                foreach (EntTipoProyecto elemento in listaTipoServicio)
                {
                    this.cmbProyecto.Items.Insert
                        (indexCombo += 1, new ListItem(elemento.Descripcion,
                            elemento.CveTipoProyecto.ToString(), true));
                }
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }

        private void LlenarComboTipoAvanveOperativo()
        {
            try
            {
                // llenamos el combo tipo proyecto 
                CtrlAvanceOperativo controlTipoServicios = new CtrlAvanceOperativo();
                List<EntAvanceOperativo> listaTipoServicio = new List<EntAvanceOperativo>();

                listaTipoServicio =
                    (List<EntAvanceOperativo>)controlTipoServicios.ObtenerTodos().
                    ConvertAll<EntAvanceOperativo>(delegate(IEntidad enti) { return (EntAvanceOperativo)enti; });

                int indexCombo = 0;
                this.cmbAvanceOperativo.Items.Clear();
                this.cmbAvanceOperativo.Items.Insert(0, new ListItem
                ("Seleccione un Elemento", "-1", true));

                foreach (EntAvanceOperativo elemento in listaTipoServicio)
                {
                    this.cmbAvanceOperativo.Items.Insert
                        (indexCombo += 1, new ListItem(elemento.Descripcion,
                            elemento.CveAvanceOperativo.ToString(), true));
                }
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }

        #endregion

        #region "Base de datos"

        private void getSolicitudTrabajosARealizar()
        {
            EntSolicitudTrabajosRealizar solicitudTrabajo = new EntSolicitudTrabajosRealizar();
            solicitudTrabajo.CveTrabajoRealizar = int.Parse(HddCveSolicitudTrabajosRealizar.Value);
            CtrlSolicitudTrabajosRealizar controlSolTrabRealizar = new CtrlSolicitudTrabajosRealizar();

            solicitudTrabajo = controlSolTrabRealizar.Obtener(solicitudTrabajo);

            if (null != solicitudTrabajo)
            {
                lblStatus.Text = "Estatus: "+solicitudTrabajo.DescStatus;
                HddCveSolicitud.Value = solicitudTrabajo.CveSolicitud.ToString();
                if (this.cmbPOA.Items.FindByValue(solicitudTrabajo.POA) == null)
                    cmbPOA.Items.Add(new ListItem(solicitudTrabajo.POA, solicitudTrabajo.POA));
                this.cmbPOA.SelectedValue = solicitudTrabajo.POA;
                this.txtComentarios.Text = solicitudTrabajo.Descripcion;
                this.txtKmOrigen.Text = solicitudTrabajo.Origen;
                this.txtKmDestino.Text = solicitudTrabajo.Destino;
                this.txtLongitud.Text = solicitudTrabajo.Longitud.ToString();
                this.txtOrigen.Text = solicitudTrabajo.InstalacionOrigen;
                this.txtDestino.Text = solicitudTrabajo.InstalacionDestino;

                this.txtDiametro.Text = solicitudTrabajo.Diametro.ToString();
                this.txtNoPera.Text = solicitudTrabajo.NoPera;
                this.txtSolicitud.Text = solicitudTrabajo.CveSolicitud.ToString();
                this.cmbTipoServicio.SelectedValue = solicitudTrabajo.CveTipoServicio.ToString();
                this.txtAnchoVia.Text = solicitudTrabajo.AnchoDerechoVia.ToString();

                // Hace referencia a la tabla CAT_TIPO_CLASIFICACION_SERVICI
                this.chkObra.SelectedValue = solicitudTrabajo.CveTipoSimplificacion.ToString();

                // L.- loczalizacion, D.- Origen Destino,O.- Otros. ... Esta columna es usada para condicionar la creacion del nombre de la obra en base a los dstos proporcionados
                int indice = 2;
                if (solicitudTrabajo.TrabajoRealizar == "L")
                {
                    cmbTipoServicio.SelectedValue = solicitudTrabajo.CveTipoServicio.ToString();
                    indice = 0;
                }
                else if (solicitudTrabajo.TrabajoRealizar == "D")
                {
                    cmbTipoServicioDuctos.SelectedValue = solicitudTrabajo.CveTipoServicio.ToString();
                    indice = 1;
                }
                else
                {
                    cmbTipoServicioOtros.SelectedValue = solicitudTrabajo.CveTipoServicio.ToString();
                }
                this.chkTipoInstalacion.SelectedIndex = indice;
                EjecutaTipoSerivio(solicitudTrabajo.TrabajoRealizar);


                this.cmbProyecto.SelectedValue = solicitudTrabajo.CveTipoProyecto.ToString();
                this.txtObraSiarp.Text = solicitudTrabajo.CveObraSiarp;
                this.cmbAvanceOperativo.SelectedValue = solicitudTrabajo.CveAvanceOperativo.ToString();
                this.txtLongitud.Text = solicitudTrabajo.Largo.ToString();
                this.txtOrigen.Text = solicitudTrabajo.Origen;
                this.txtDestino.Text = solicitudTrabajo.Destino;
                this.chkPrioritaria.Checked = solicitudTrabajo.EsPrioritaria == "S" ? true : false;
                this.cmbCampo.SelectedValue = solicitudTrabajo.CveCampo.ToString();
                this.txtObraSiarp.Text = solicitudTrabajo.CveObraSiarp;
                this.txtNotaturno.Text = solicitudTrabajo.NumeroNotaTurno;

                this.txtFechaPrioritaria.Text = solicitudTrabajo.FechaPrioritaria;
                this.txtEntregaPlanos.Text = solicitudTrabajo.FechaEntregaPlanos;
                this.txtPlanosValidados.Text = solicitudTrabajo.FechaPlanosValidados;
                this.txtPlanosCorregidos.Text = solicitudTrabajo.FechaPlanosCorregidos;
                this.txtFechaUltimoPP.Text = solicitudTrabajo.FechaultimoPP;
                this.txtFechaArreglo.Text = solicitudTrabajo.FechaEstimadaArreglo.ToShortDateString();

                GetSolicitud();

                string[] Jefes = null;

                if (!string.IsNullOrWhiteSpace(solicitudTrabajo.Jefes))
                {
                    Jefes = solicitudTrabajo.Jefes.Split(',');

                    for (int i = 0; i < Jefes.Count(); i++)
                    {
                        string[] elemento = Jefes[i].Split('|');

                        lstJefes.Items.Add(new ListItem(elemento[1].ToString(), elemento[0].ToString()));
                    }
                }


            }
        }

        private void GetSolicitud()
        {
                Solicitud = new EntSolicitud();
                Solicitud.CveSolicitud = int.Parse(HddCveSolicitud.Value);
                controlSolicitud = new CtrlSolicitud();

                Solicitud = controlSolicitud.Obtener(Solicitud);

                if (Solicitud != null)
                {
                    HddCveSolicitud.Value = Solicitud.CveSolicitud.ToString();
                    txtSolicitud.Text = Solicitud.NoOficio;
                    txtNotaturno.Text = Solicitud.NumeroNotaTurno;
                }

        }

        #endregion

        private void CancelarEdicion()
        {
            string valor = "parent.window.open('../Marcos/EndPEMEX.aspx','_top');";
            string script = string.Empty;
            string CadMensaje = string.Empty;

            script = "<script type='text/javascript' language='javascript'>";
            script = script + valor + ";";


            script = script + "</script>";

            ScriptManager.RegisterStartupScript(UpdatePanelCuerpo, this.GetType(), "temp", script, false);
        }

        private void EjecutaTipoSerivio(string valor)
        {
            string script = string.Empty;
            string CadMensaje = string.Empty;

            script = "<script type='text/javascript' language='javascript'>changeTipoInstalacion('";
            script = script + valor + "');";


            script = script + "</script>";

            ScriptManager.RegisterStartupScript(UpdatePanelCuerpo, this.GetType(), "temp", script, false);
        }

        #region Turnar

        public void LlenarComboJef()
        {
            CtrlUsuario ctrlUsuario = new CtrlUsuario();
            List<EntUsuario> ListaUsuario = new List<EntUsuario>();
            ListaUsuario = (List<EntUsuario>)ctrlUsuario.ObtenerTodosAfectadosGestores(Usuario).ConvertAll<EntUsuario>(delegate(IEntidad enti) { return (EntUsuario)enti; });

            int indexCombo = 0;
            this.cmbTurnar.Items.Clear();
            this.cmbTurnar.Items.Insert(0, new ListItem("Seleccione un empleado", "", true));
            foreach (EntUsuario elemento in ListaUsuario)
                this.cmbTurnar.Items.Insert(indexCombo += 1, new ListItem(elemento.NombreCompleto, elemento.CveUsuario.ToString(), true));

        }
        protected void btnAgregarJefe_Click(object sender, EventArgs e)
        {
            try
            {
                lstJefes.Items.Add(new ListItem(cmbTurnar.SelectedItem.Text, cmbTurnar.SelectedItem.Value));
                cmbTurnar.Items.Remove(cmbTurnar.SelectedItem);
                cmbTurnar.SelectedIndex = 0;
                UpdatePanelComboTurnar.Update();
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }

        protected void btnEliminarJefe_Click(object sender, EventArgs e)
        {
            try
            {
                controlTurnarJefeArea.EliminarObraTurnada(new EntSolicitudTrabajosRealizar() { CveTrabajoRealizar = int.Parse(HddCveSolicitud.Value) });
                cmbTurnar.Items.Add(new ListItem(lstJefes.SelectedItem.Text, lstJefes.SelectedItem.Value));
                lstJefes.Items.Remove(lstJefes.SelectedItem);
                UpdatePanelComboTurnar.Update();
            }
            catch (BussinesLogicException ex)
            {
                Mensaje(ex.Message);
            }
        }
        #endregion
    }
}